package org.jsola.hr.service.async;

import org.jsola.admin.vo.AreaReduceVO;
import org.jsola.hr.entity.EmpInfoDO;
import org.jsola.hr.query.ModuleFieldQuery;
import org.jsola.hr.vo.EmpAllInfoVO;
import org.jsola.hr.vo.EmpFieldValueVO;
import org.jsola.user.core.TokenUser;

import java.util.List;
import java.util.Map;
import java.util.concurrent.Future;

/**
 * 花名册详情异步导入
 *
 * @author wcl
 */
public interface IAsyncEmpInfoDetailService {

    /**
     * 保存部门信息
     *
     * @param empInfo      员工信息
     * @param companyId    用工单位id
     * @param depNameIdMap 部门名称(全路径)-部门Id
     * @param tokenUser    当前用户
     * @return Future
     */
    Future<String> saveDept(EmpInfoDO empInfo, String companyId, Map<String, String> depNameIdMap, TokenUser tokenUser);

    /**
     * 保存岗位信息
     *
     * @param empInfo   员工信息
     * @param companyId 用工单位id
     * @param tokenUser 当前用户
     * @return Future
     */
    Future<String> savePosition(EmpInfoDO empInfo, String companyId, TokenUser tokenUser);

    /**
     * 保存花名册合同
     *
     * @param empInfo   员工信息
     * @param companyId 用工单位id
     * @param tokenUser 当前用户
     * @return Future
     */
    Future<String> saveContract(EmpInfoDO empInfo, String companyId, TokenUser tokenUser);

    /**
     * 保存学历
     *
     * @param empInfo   员工信息
     * @param companyId 用工单位id
     * @param isAdd     是否为新增操作；true：新增，false：修改
     * @param tokenUser 当前用户
     * @return Future
     */
    Future<String> saveEducation(EmpInfoDO empInfo, String companyId, boolean isAdd, TokenUser tokenUser);

    /**
     * 保存自定义字段
     *
     * @param empInfo   员工信息
     * @param companyId 用工单位id
     * @param areaList  地区
     * @param tokenUser 当前用户
     * @return Future
     */
    Future<String> saveAddition(EmpInfoDO empInfo, String companyId, List<AreaReduceVO> areaList, TokenUser tokenUser);

    /**
     * 保存今日新增
     *
     * @param empInfo   员工信息
     * @param companyId 用工单位id
     * @param areaList  地区
     * @param isAdd     是否为新增操作；true：新增，false：修改
     * @param tokenUser 当前用户
     * @return Future
     */
    Future<String> saveOperationEmpRecord(EmpInfoDO empInfo, String companyId, List<AreaReduceVO> areaList, boolean isAdd, TokenUser tokenUser);

    Future<EmpAllInfoVO> listDepNameByEmp(String companyId, String empId, String siteId);

    Future<EmpAllInfoVO> listPositionNameByEmp(String companyId, String empId, String siteId);

    Future<EmpAllInfoVO> cardListByEmpId(String empInfoId, String siteId);

    Future<EmpAllInfoVO> familyListByEmpId(String empInfoId, String siteId);

    Future<EmpAllInfoVO> rewardPunishListByEmpId(String empInfoId, String siteId);

    Future<EmpAllInfoVO> certificateListByEmpId(String empInfoId, String siteId);

    Future<EmpAllInfoVO> contractListByEmpId(String empInfoId, String siteId);

    Future<EmpAllInfoVO> contactListByEmpId(String empInfoId, String siteId);

    Future<EmpAllInfoVO> educationListByEmpId(String empInfoId, String siteId);

    Future<EmpAllInfoVO> trainListByEmpId(String empInfoId, String siteId);

    Future<EmpAllInfoVO> empWorkListByEmpId(String empInfoId, String siteId);

    Future<EmpAllInfoVO> paperContractListByEmpId(String empInfoId, String siteId);

    Future<EmpAllInfoVO> additionListByEmpId(EmpInfoDO empInfoDO);

    Future<Map<String, EmpFieldValueVO>> getEmpFieldValue(ModuleFieldQuery moduleFieldQuery, TokenUser tokenUser);

    void empCompleteInfoAsync(List<String> list, TokenUser tokenUser);

    Future<String> saveEmpFamily(EmpInfoDO empInfo, String companyId, TokenUser tokenUser);

    Future<String> empContacts(EmpInfoDO empInfo, String companyId, TokenUser tokenUser);
}
